const { ERROR } = require('./error')

/**
 * 获取用户ID的辅助函数
 * @param {object} context 上下文对象
 * @returns {string} 用户ID
 */
async function getUserId(context) {
	try {
		// 从上下文获取用户信息
		const token = context.getUniIdToken()
		if (!token) {
			throw {
				errCode: ERROR.UNAUTHORIZED,
				errMsg: context.t ? context.t('unauthorized') : '用户未登录'
			}
		}

		// 使用 uniIdCommon 实例验证 token
		const { code, uid } = await context.uniIdCommon.checkToken(token)
		
		if (code !== 0 || !uid) {
			throw {
				errCode: ERROR.UNAUTHORIZED,
				errMsg: context.t ? context.t('unauthorized') : '用户未登录'
			}
		}
		
		return uid
	} catch (error) {
		console.error('[getUserId] Error:', error)
		throw {
			errCode: ERROR.UNAUTHORIZED,
			errMsg: context.t ? context.t('unauthorized') : '用户未登录'
		}
	}
}

/**
 * 获取数据类型
 */
function getType (val) {
  return Object.prototype.toString.call(val).slice(8, -1).toLowerCase()
}

/**
 * 从clientInfo中提取语言设置
 * @param {object} clientInfo 客户端信息
 * @returns {string} 语言代码
 */
function getLanguageFromClientInfo(clientInfo) {
	// 优先使用locale，如果没有则使用appLanguage，最后回退到zh-Hans
	const locale = clientInfo.locale || clientInfo.appLanguage || 'zh-Hans'
	
	// 规范化语言代码
	const langMap = {
		'zh': 'zh-Hans',
		'zh-CN': 'zh-Hans',  
		'zh-Hans': 'zh-Hans',
		'zh-Hant': 'zh-Hans', // 暂时都映射到简体中文
		'en': 'en',
		'en-US': 'en',
		'ja': 'ja',
		'ja-JP': 'ja',
		'ko': 'ko',
		'ko-KR': 'ko',
		'es': 'es',
		'es-ES': 'es',
		'fr': 'fr',
		'fr-FR': 'fr'
	}
	
	return langMap[locale] || 'zh-Hans'
}

/**
 * 从多语言对象中提取指定语言的文本
 * @param {object} multiLangObj 多语言对象
 * @param {string} language 目标语言
 * @returns {string} 文本内容
 */
function getMultiLangText(multiLangObj, language = 'zh-Hans') {
	if (!multiLangObj || typeof multiLangObj !== 'object') {
		return multiLangObj || ''
	}
	
	// 尝试获取指定语言的文本
	if (multiLangObj[language]) {
		return multiLangObj[language]
	}
	
	// 回退到英文
	if (multiLangObj.en) {
		return multiLangObj.en
	}
	
	// 最后回退到中文
	if (multiLangObj['zh-Hans']) {
		return multiLangObj['zh-Hans']
	}
	
	// 如果都没有，返回第一个可用的值
	const keys = Object.keys(multiLangObj)
	return keys.length > 0 ? multiLangObj[keys[0]] : ''
}

/**
 * 检查clientInfo格式
 * @param {object} clientInfo 客户端信息
 */
function checkClientInfo(clientInfo) {
	if (!clientInfo || typeof clientInfo !== 'object') {
		throw {
			errCode: ERROR.INVALID_CLIENT_INFO,
			errMsg: 'Invalid client info'
		}
	}
	
	if (!clientInfo.appId) {
		throw {
			errCode: ERROR.INVALID_CLIENT_INFO,
			errMsg: 'Missing appId in client info'
		}
	}
	
	if (!clientInfo.uniPlatform) {
		throw {
			errCode: ERROR.INVALID_CLIENT_INFO,
			errMsg: 'Missing uniPlatform in client info'
		}
	}
}

/**
 * 获取HTTP客户端信息
 */
function getHttpClientInfo () {
  const requestId = this.getUniCloudRequestId()
  const { clientIP, userAgent, source, secretType = 'none' } = this.getClientInfo()
  const { clientInfo = {} } = JSON.parse(this.getHttpInfo().body)

  return {
    ...clientInfo,
    clientIP,
    userAgent,
    source,
    secretType,
    requestId
  }
}

/**
 * 获取HTTP uniIdToken
 */
function getHttpUniIdToken () {
  const { uniIdToken = '' } = JSON.parse(this.getHttpInfo().body)
  return uniIdToken
}

/**
 * 验证HTTP方法
 */
function verifyHttpMethod () {
  const { headers, httpMethod } = this.getHttpInfo()

  if (!/^application\/json/.test(headers['content-type']) || httpMethod.toUpperCase() !== 'POST') {
    throw {
      errCode: ERROR.UNSUPPORTED_REQUEST,
      errMsg: 'unsupported request'
    }
  }
}

/**
 * 通用方法，支持 callFunction 与 URL化
 */
function universal () {
  if (this.getClientInfo().source === 'http') {
    verifyHttpMethod.call(this)
    this.getParams()[0] = JSON.parse(this.getHttpInfo().body).params
    this.getUniversalClientInfo = getHttpClientInfo.bind(this)
    this.getUniversalUniIdToken = getHttpUniIdToken.bind(this)
  } else {
    this.getUniversalClientInfo = this.getClientInfo
    this.getUniversalUniIdToken = this.getUniIdToken
  }
}

module.exports = {
	getUserId,
	getType,
	getLanguageFromClientInfo,
	getMultiLangText,
	checkClientInfo,
	universal
}